mixed process_value(string func)
{
	int tmp;
	string arg;
	object obj;
	mixed ret;

	if (!func || !stringp(func))
		return 0;

	if ((tmp = member_array('|', func)) != -1)
	{
		arg = func[tmp + 1..];
		func = func[0..tmp-1];
	}
	if ((tmp = member_array(':', func)) != -1)
	{
		obj = find_object(func[tmp + 1..]);
		func = func[0..tmp-1];
	}
	else
	{
		obj = previous_object();
	}
	if (!obj)
		return 0;

return call_other(obj, func, explode(arg, "|")...);
}

string process_string(string str)
{
	int pr_start;
	string
	array parts = explode(str, "@@");

	pr_start = !(str[0..1] == "@@");

	for (int il = pr_start; il < sizeof(parts); il += 2)
	{
		string tmp = process_value(parts[il]);
		if (stringp(tmp))
			parts[il] = tmp;
	}

	return implode(parts, "");
}

